docker镜像下载(终于有人把Docker讲清楚了,Docker入门教程,原来这么简单) 您所在的位置:网站首页 docker v什么意思 docker镜像下载(终于有人把Docker讲清楚了,Docker入门教程,原来这么简单)

docker镜像下载(终于有人把Docker讲清楚了,Docker入门教程,原来这么简单)

2023-03-22 00:41| 来源: 网络整理| 查看: 265

本文目录终于有人把Docker讲清楚了,Docker入门教程,原来这么简单如何打包创建镜像和运行Docker容器及常用命如何在win7环境下安装docker构建docker镜像,download依赖包存储问题docker 无法下载镜像下载镜像前必须使用dockerlogin命令登录仓库docker笔记 配置镜像安装Docker环境并下载TensorFlow镜像centosubuntudocker镜像通用吗超值一篇分享,Docker:从入门到实战过程全记录终于有人把Docker讲清楚了,Docker入门教程,原来这么简单

Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖到一个可移植的容器中,然后发布到任何流行的机器上。Docker的迅猛发展和全新理念,席卷了整个IT界,成为云时代的一颗新星。

Docker相比于传统虚拟化方式具有更多的优势:

我们可以从下面这张表格很清楚地看到容器相比于传统虚拟机的特性的优势所在:

企业使用一项技术是为了解决当前企业环境中存在的某个痛点。目前整个软件行业存在着以下几个痛点。

(1)软件更新发布及部署低效,过程繁琐且需要人工介入。

(2)环境一致性难以保证。

(3)不同环境之间迁移成本太高。

Docker在很大程度上解决了上述问题。

首先, Docker的使用十分简单,从开发的角度来看就是“三步走”:构建、运输、运行。其中,关键步骤是构建环节,即打包镜像文件。但是从测试和运维的角度来看,那就只有两步:复制、运行。有了这个镜像文件,想复制到哪里运行都可以,完全和平台无关。

Docker这种容器技术隔离出了独立的运行空间,不会和其他应用争用系统资源,不需要考虑应用之间的相互影响。

其次, 因为在构建镜像时就处理完了服务程序对于系统的所有依赖,所以在使用时,可以忽略原本程序的依赖以及开发语言。对测试和运维人员而言,可以更专注于自己的业务内容。

最后, Docker为开发者提供了一种开发环境的管理办法,帮助测试人员保证环境的同步,为运维人员提供了可移植的标准化部署流程。

动力节点的 Docker入门教程,将带你一步一步从基础到实践学习Docker,了解什么是Docker,Docker的核心思想、核心组件诸如镜像,仓库,容器等,通过大量的实际操作循序渐进地介绍Docker,带你轻松玩转Docker,Docker技术也是当今IT从业人员的必备技能之一。

在线学习:https://www.bilibili.com/video/BV1QA411L7B5

资料下载:http://www.bjpowernode.com/?toutiao

•001.Docker视频教程:虚拟化技术发展史

•002.Docker视频教程:虚拟化技术是什么

•003.Docker视频教程:虚拟化技术的分类

•004.Docker视频教程:虚拟化技术的优缺点

•005.Docker视频教程:容器技术的发展

•006.Docker视频教程:Docker的发展 历史

•007.Docker视频教程:Docker是什么

•008.Docker视频教程:容器和虚拟机的区别(1)

•009.Docker视频教程:容器和虚拟机的区别(2)

•010.Docker视频教程:为什么要使用Docker视频教程:Docker

•011.Docker视频教程:Docker的版本

•012.Docker视频教程:Docker的安装

•013.Docker视频教程:Docker服务启动

•014.Docker视频教程:Docker服务信息

•015.Docker视频教程:Docker使用初体验-Docker的运行机制

•016.Docker视频教程:Docker使用初体验-Docker官方镜像仓库

•017.Docker视频教程:Docker使用初体验-Docker官方镜像下载

•018.Docker视频教程:Docker使用初体验-Docker镜像启动运行

•019.Docker视频教程:Docker使用初体验-访问容器中的Tomcat服务

•020.Docker视频教程:Docker使用初体验-Docker的网络访问机制

•021.Docker视频教程:Docker使用初体验-进入Docker容器内部

•022.Docker视频教程:Docker使用初体验-补充说明

•023.Docker视频教程:Docker的体系架构(1)

•024.Docker视频教程:Docker的体系架构(2)r

•025.Docker视频教程:Docker核心组件

•026.Docker视频教程:Docker核心组件-镜像的基本概念

•027.Docker视频教程:Docker核心组件-镜像的组成结构

•028.Docker视频教程:Docker核心组件-镜像的日常操作(1)

•029.Docker视频教程:Docker核心组件-镜像的日常操作(2)

•030.Docker视频教程:Docker核心组件-镜像的日常操作(3)

•031.Docker视频教程:Docker核心组件-镜像的日常操作(4)

•032.Docker视频教程:Docker核心组件-容器的基本概念

•033.Docker视频教程:Docker核心组件-容器的日常操作(1)

•034.Docker视频教程:Docker核心组件-容器的日常操作(2)

•035.Docker视频教程:Docker核心组件-仓库的基本概念

•036.Docker视频教程:Docker核心组件-官方仓库与阿里云仓库

•037.Docker视频教程:Docker核心组件-仓库的日常操作(1)

•038.Docker视频教程:Docker使用示例-安装MySQL

•039.Docker视频教程:Docker使用示例-访问与操作MySQL容器

•040.Docker视频教程:Docker使用示例-安装Nginx

•041.Docker视频教程:Docker使用示例-访问Nginx容器

•042.Docker视频教程:Docker使用示例-容器Nginx部署静态网站

•043.Docker视频教程:Docker使用示例-安装Zookeeper

•044.Docker视频教程:Docker使用示例-安装ActiveMQ

•045.Docker视频教程:认识Dockerfile文件

•046.Docker视频教程:Dockerfile的基本结构

•047.Docker视频教程:Dockerfile常用指令

•048.Docker视频教程:自定义JDK镜像Dockerfile文件

•049.Docker视频教程:自定义JDK镜像构建与运行测试

•050.Docker视频教程:自定义Tomcat镜像Dockerfile文件

•051.Docker视频教程:自定义Tomcat镜像构建与运行测试

•052.Docker视频教程:自定义MySQL镜像Dockerfile文件

•053.Docker视频教程:自定义MySQL镜像构建与运行测试

•054.Docker视频教程:自定义Redis镜像Dockerfile文件

•055.Docker视频教程:自定义Redis镜像构建与运行测试(1)

•056.Docker视频教程:自定义Redis镜像构建与运行测试(2)

•057.Docker视频教程:阿里云容器镜像仓库

•058.Docker视频教程:阿里云镜像仓库管理后台

•059.Docker视频教程:发布镜像到阿里云镜像仓库(1)

•060.Docker视频教程:发布镜像到阿里云镜像仓库(2)

•061.Docker视频教程:发布镜像到阿里云镜像仓库(3)

•062.Docker视频教程:Docker Hub官方镜像加速

•063.Docker视频教程:Docker部署SpringBoot项目-介绍

•064.Docker视频教程:Docker部署SpringBoot项目-本地测试

•065.Docker视频教程:Docker部署SpringBoot项目-基本流程

•066.Docker视频教程:Docker部署SpringBoot项目-打Jar包与War包

•067.Docker视频教程:Docker部署SpringBoot项目-jar项目的镜像构建

•068.Docker视频教程:Docker部署SpringBoot项目-jar项目的镜像运行与测试(1)

•069.Docker视频教程:Docker部署SpringBoot项目-jar项目的镜像运行与测试(2)

•070.Docker视频教程:Docker部署SpringBoot项目-war项目的镜像构建与运行

•071.Docker视频教程:Docker部署SpringBoot项目-war项目的测试

•072.Docker视频教程:Docker保存新镜像

•073.Docker视频教程:Docker保存的新镜像数据验证

如何打包创建镜像和运行Docker容器及常用命

在Dockerfile所在目录执行docker build -t 10.10.36.213/library/你的镜像名:版本 .别忘了最后的点,用来指定Dockerfile的位置build过程类似这样:cos@controller ~/Dockerfile/eureka $ docker build -t 10.10.36.213/library/test:v1.0 .Sending build context to Docker daemon 78.69 MBStep 1 : FROM 192.168.16.100/jdk8:8u74---》 d84b155276a9Step 2 : MAINTAINER jingchaosong [email protected]》 Using cache---》 369126ee2c40Step 3 : ADD eureka-server-1.1-SNAPSHOT.jar /root/---》 Using cache---》 cd3facb762b3Successfully built cd3facb762b3push镜像docker push 10.10.36.213/library/你的镜像名:版本如果出现push失败的情况,并且提示需要的登录,请使用以下命令login到私有镜像仓库docker login 10.10.36.213用户名admin密码Harbor12345email可以不填run容器直接以daemon方式运行docker run -d --net=mynet 10.10.36.213/library/你的镜像名:版本 命令--net=mynet是让docker调用我们自己的网络插件来分配IP地址,IP地址从我们自己配置的IP池里获取查看启动的容器的IP地址可以用以下命令docker inspect container_id | grep IPAddress交互方式运行docker run -it --net=mynet 10.10.36.213/library/你的镜像名:版本docker run的时候可以加很多参数,如容器的资源配额限制、hostname、挂载本地目录、DNS等配置,请参看docker run --help查看容器状态查看正在运行的容器的状态docker ps查看所有容器(包括已经Exit容器的状态)docker ps -a删除容器docker rm container_idcontainer_id只需要前几位字符就可以了,只要能够区别不同容器即可,不需要输入全部ID字段强制删除容器docker rm -f container_id删除镜像docker rmi image_id进入容器内部前提是必须是正在运行的容器docker exec -it container_id /bin/bash运行exit退出查看容器详细信息docker inspect container_id可以看到容器的配置信息和挂载的本地目录、网络配置、状态等

如何在win7环境下安装docker

1.下载程序包

下载最新版本的:docker-install.exe即可。 

 

该安装包安装完成后,系统上会多出三个软件:

Oracle VM VirtualBox 

Git 

Boot2Docker for Windows

以上三个默认安装即可。

2. 设置环境变量

 

 

 

在命令窗口中,输入ls 如果能找到命令说明环境添加正确。

3. 启动DOCKERT

在命令窗口中,切到docker的安装目录下 

 

 

输入sh: 

然后输入start.sh,等待启动 

 

 

第一次启动中,如果有新版本会更新,时间比较长。

如果第二次启动,就非常快了。 

 

 

4. 分析start.sh

#!/bin/bashset -e

 

# clear the MSYS MOTD

clear

 

cd “$(dirname “$BASH_SOURCE“)“

 

ISO=“$HOME/.boot2docker/boot2docker.iso“

 

if ; then

    echo ’copying initial boot2docker.iso (run “boot2docker.exe download“ to update)’

    mkdir -p “$(dirname “$ISO“)“

    cp ./boot2docker.iso “$ISO“fi

 

echo ’initializing...’

./boot2docker.exe init

echo

 

echo ’starting...’

./boot2docker.exe start

echo

 

./boot2docker.exe ip

 

echo ’connecting...’

./boot2docker.exe ssh

echo

 

echoecho ’’read

 

从内容上看主要是执行,如下语句

boot2docker.exe init

boot2docker.exe start

boot2docker.exe ssh

 

所有在命令行下执行 sh start.sh 即可

最近貌似docker也被GFW墙了

所以运行start.sh到init时,如果不幸长时间不进入下一步,就说明镜像被GFW挡住了,手动去github上下载镜像,地址为:

 

6.4 查看镜像

查看: docker images 

 

 

6.5 运行

运行:docker run -i -t ubuntu:ubuntu14 /bin/bash

构建docker镜像,download依赖包存储问题

Dockerfile 中每一条指令对应了image中的一层。从上到下,如果有一层发生变化,那么这一层以后的层都要重新构建。 所以,在Docker 构建镜像的最佳实践,是要求把不经常变化的层放在 Dockerfile 配置的最上层。  对于那些 一直不变的文件,应该做成base镜像,构建新镜像的时候从这个base镜像开始构建。

可以尝试一下添加一条指令,比如 RUN touch /home/test.txt ,看看从构建的镜像运行的容器有没有这个文件。

docker 无法下载镜像

这个镜像链接有问题,用163的镜像源,一直在用很稳定或新建文件:mkdir /etc/dockervi /etc/docker/daemon.json填入:更换docker的镜像源{ “registry-mirrors“: }

下载镜像前必须使用dockerlogin命令登录仓库

不是。下载镜像前需要找到专属区域,不是必须使用dockerlogin命令登录仓库的。与仓库是没有关系的,是需要对应的空间区域就可以。

docker笔记 配置镜像

一、配置mirror下载安装docker

切换到你临时文件夹下,下载安装脚本,指定下载的脚本文件名称为get-docker.sh

get-docker.sh脚本内容镜像源是境外,可能会慢,执行脚本的时候可以重新指定镜像源。

下载的过程会使用公钥、私钥检测下载的包是否被攻击修改过。安装完成标志:

改完配置之后重启服务步骤

重启docker

安装完成。

二、配置docke pull镜像

下载镜像的时候docker pull:xxx会很慢,配置pull镜像解决:

在 /etc/docker/daemon.json 文件(没有则创建)中添加下面参数(此处使用的是中国 科技 大学/阿里/网易云、百度的docker镜像源,可以单个可以多个)

重启docker

执行docker info 查看结果:

安装Docker环境并下载TensorFlow镜像

要点1:必须是64位系统,不能用32位虚拟机(因为Docker官方已经不再支持32位系统了)

将当前用户加入docker组,通过组策略允许非root用户操作docker

参考《TensorFlow(1):使用docker镜像搭建TensorFlow环境》 https://blog.csdn.net/freewebsys/article/details/70237003

centosubuntudocker镜像通用吗

centosubuntudocker镜像通用,docker 会先从本地寻找ubuntu镜像,存在那么就启动,如果不存在,那么docker就会从默认的镜像仓库中下载出ubuntu镜像。

超值一篇分享,Docker:从入门到实战过程全记录

作者 | 天元浪子

来源 | CSDN博客

想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。可以说,Docker是虚拟化技术不断发展的必然结果。

那么,什么是容器呢?容器和虚拟机有什么不同?Docker和容器又是什么关系呢?搞明白这几个问题,Docker的概念就清晰了。

1.1 虚拟机和容器

借助于VMWare等软件,可以在一台计算机上创建多个虚拟机,每个虚拟机都拥有独立的操作系统,可以各自独立的运行程序。这种分身术虽然隔离度高(操作系统级),使用方便(类似物理机),但占用存储资源多(GB级)、启动速度慢(分钟级)的缺点也是显而易见的。

相较于虚拟机,容器(Container)是一种轻量型的虚拟化技术,它虚拟的是最简运行环境(类似于沙盒)而非操作系统,启动速度快(秒级)、占用存储资源少(KB级或MB级),容器间隔离度为进程级。在一台计算机上可以运行上千个容器,这是容器技术对虚拟机的碾压式优势。

1.2 容器、镜像和Docker

Docker是一个开源的应用容器引擎,可以创建容器以及基于容器运行的程序。Docker可以让开发者打包他们的应用和依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

听起来很简单,但是在Docker和容器之间,还隐藏着一个镜像的概念,令初学者颇感困惑。本质上,Docker镜像是一个特殊的文件系统,它提供容器运行时所需的程序、库、资源、配置等文件。Docker镜像类似于一个py文件,它需要Docker的运行时(类似于Python解释器)运行。镜像被运行时,即创建了一个镜像的实例,一个实例就是一个容器。

1.3 Docker 和 k8s

作为容器引擎,Docker为容器化的应用程序提供了开放的标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付、测试和部署代码。随着容器的大量使用,又产生了如何协调、调度和管理容器的问题,Docker的容器编排应运而生。

k8s是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署、规划、更新、维护的一种机制。

Docker和k8sr都是以containerd(容器化标准)作为运行时,因此使用Docker创建的镜像完全可以在k8s中无障碍的使用。

2.1 在ubuntu中安装

在linux系统中安装Docker非常简单,官方为我们提供了一键安装脚本。这个方法也适用于Debian或CentOS等发行版。

安装过程如果出现超时,不要灰心,多试几次,总会成功的。安装完成后,Docker只能被root用户使用,可以使用下面的命令取消权限限制:

然后,重启docker服务:

最后,关闭当前的命令行,重新打开新的命令行就可以了。

顺便提一下,如果在CentOS下安装,可能会出现一堆类似于下面的错误:

这是由于docker和Podman冲突造成的,需要先卸载Podman:

2.2 在Win10中安装

Docker的运行,依赖linux的环境,官方提供了Docker Desktop for Windows,但是它需要安装Hyper-V,Hyper-V是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10。这个虚拟机一旦启用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本将无法使用!如果你必须在电脑上使用其他虚拟机(例如开发 Android 应用必须使用的模拟器),请不要使用 Hyper-V!

我的电脑是win10家庭版,不能直接安装hyper-v,需要将下面的命令保存到cmd文件中:

然后在cmd文件上点击右键,选择使用管理员运行。执行完毕后会重启,在重启的过程中进行安装。

2.3 Hello world

docker服务启动的情况下,运行下面的命令:

此命令的含义是:

第一次运行时,因为本地没有ubuntu:20.04镜像,docker会自动从镜像服务器下载。下载过程可能需要多试几次,只要成功一次,以后执行就不再需要下载了。

docker官方还提供了一个hello-world镜像,可以直接运行:

此命令省略了镜像版本和运行参数,docker使用latest作为版本,即最新版本。

从hello world的例子中,也可以体验到,docker实例的运行是非常快的。

docker官方的镜像库比较慢,在进行镜像操作之前,需要将镜像源设置为国内的站点。

新建文件/etc/docker/daemon.json,输入如下内容:

然后重启docker的服务:

3.1 列出本地所有镜像

执行命令 docker images 可以查看

当前我本地只有刚才安装的两个镜像。

3.2 从镜像库中查找镜像

执行命令 docker search 镜像名称可以从docker镜像库中查找镜像。

最好选择官方(OFFICIAL)的镜像,这样的镜像最稳定一些。

3.3 下载新的镜像

执行命令docker pull 镜像名称:版本号即可下载新的镜像。

镜像下载后,就可以使用镜像来创建容器了。

4.1 启动容器

执行命令docker run即可启动容器,也就是创建某个镜像的实例。docker run命令非常复杂,可以先执行一个docker run --help来查看帮助:

比如我们要执行python的shell,需要添加-it参数,即:docker run -it python:3.8

4.2 将宿主机的文件挂载到容器

docker容器与宿主机是隔离的,要想让容器内的程序能访问宿主机上的文件,需要通过-v参数将宿主机的文件挂载到容器中。

比如我们在宿主机上有一个hello.py,可以打印hello,想要在python容器中执行,就需要进行挂载。-v后还需要接两个参数,分别是宿主机的目录和容器内的目录,两者使用:分隔,路径必须都是绝对路径。

我的hello.py保存在主目录的/docker_test目录中,将这个目录挂载到容器的/docker_test目录,然后在容器内执行python /docker_test/hello.py:

4.3 容器的端口映射

我们修改一下hello.py,创建一个socket服务端,并监听5000端口,当有客户端连接时,打印客户端的地址,先客户端发送hello,然后关闭连接:

在容器内执行:

接下来,尝试用telnet命令连接,结果却是失败的。原因是,127.0.0.1是宿主机的ip地址,5000是容器的端口,这与我们的习惯稍微有些不同。事实上,docker的容器是非常轻量的,它并没有自己的网络,要想访问容器的端口,需要进行端口映射,将容器的某端口映射到宿主机的端口,客户端连接时,只要与宿主机的端口进行连接就可以了。

需要注意的是,上面的代码创建的服务器,无论如何也不可能被客户端连接,因为代码中绑定了127.0.0.1的ip,在容器中运行时,需要绑定所有ip,即0.0.0.0。

然后,再使用-p参数,-p还需要三个参数,即宿主机的ip地址、宿主机的端口、容器的端口,三者之间使用:分隔。一般的,可以将宿主机的ip地址省略,只写宿主机的端口:容器的端口即可。

这样,就将容器的5000端口映射到了宿主机的5001端口,使用:

即可与容器中的服务器进行连接。

4.4 容器管理

上面的服务运行之后,可以使用docker ps命令,查看运行中的容器:

显示的内容有下面几列:

要想结束容器,可以使用docker kill 容器ID命令。

一般而言,当我们的程序开发完成后,会连同程序文件与运行环境一起制作成一个新的镜像。

要制作镜像,需要编写Dockerfile。DockeFile由多个命令组成,常用的命令有:

注意,Docker镜像中有一个层的概念,每执行一个RUN命令,就会创建一个层,层过多会导致镜像文件体积增大。尽量在RUN命令中使用&&连接多条shell命令,减少RUN命令的个数,可以有效减小镜像文件的体积。

5.1 自制显示文本文件内容镜像

编写cat.py,接收一个文件名,由python读取文件并显示文件的内容:

这个例子比较简单,缩写Dockerfile如下:

这个Dockerfile的含义是:

需要说明的是,ENTRYPOINT有两种写法:

这里采用第二种写法,是因为我们要在外部给容器传递参数。执行命令编译Docker镜像:

这个命令中,-t的含义是目标,即生成的镜像名为hello,版本号为1.0,别忘了最后那个.,这叫到上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

这样,我们的第一个镜像就制作完成了,使用下面的命令执行它:

即可看到~/docker_test/cat/files/test.txt的内容。

5.2 自制web服务器镜像

我们使用tornado开发一个网站,而python的官方镜像是没有tornado库的,这就需要在制作镜像时进行安装。

测试的ws.py如下:

编写Dockerfile文件如下:

在此我们验证一下CMD与ENTRYPOINT的区别。在Dockerfile所在有目录下执行如下命令:

执行完成后,再使用docker images使用就可以看到生成的镜像了,然后使用下面的命令运行:

在浏览器中输入宿主机的ip和8000端口,就可以看到页面了。

在这个例子中,我使用的运行命令是CMD,如果在docker run中指定的其他的命令,此命令就不会被执行,如:

此时,容器中被执行的是python命令,而不是我们的服务。在更多情况下,我们希望在docker run命令中为我们的服务传参,而不是覆盖执行命令,那么,我们应该使用ENTRYPOINT而不是CMD:

上面这种写法,是不支持传递参数的,ENTRYPOINT和CMD还支持另一种写法:

使用这种写法,docker run命令中的参数才可以传递给hello.py:

这个命令中,--port=9000被作为参数传递到hello.py中,因此容器内的端口就成了9000。

在生产环境中运行时,不会使用-it选项,而是使用-d选项,让容器在后台运行:

这种方式下,即使当前的控制台被关闭,该容器也不会停止。

5.3 自制apscheduler服务镜像

接下来,制作一个使用apscheduler编写的服务镜像,代码如下:

Dockerfile也是信手拈来:

生成镜像:

应该可以运行了,文件复制需要两个目录,在运行时,可以使用两次-v来挂载不同的目录:

前面用到的官方python镜像大小足足882MB,在这个基础上,再安装用到的第三方库,添加项目需要的图片等资源,大小很容易就超过1个G,这么大的镜像,网络传给客户非常的不方便,因此,减小镜像的体积是非常必要的工作。

docker hub上有个一python:3.8-alpine镜像,大小只有44.5MB。之所以小,是因为alpine是一个采用了busybox架构的操作系统,一般用于嵌入式应用。我尝试使用这个镜像,发现安装一般的库还好,但如果想安装numpy等就会困难重重,甚至网上都找不到解决方案。

还是很回到基本的路线上来,主流的操作系统镜像,ubuntu的大小为72.9MB,centos的大小为209MB——这也算是我更喜欢使用ubuntu的一个重要原因吧!使用ubuntu作为基础镜像,安装python后的大小为139MB,再安装pip后的大小一下子上升到了407MB,要是再安装点其他东西,很容易就赶上或超过python官方镜像的大小了。

看来,寻常路线是很难压缩镜像文件体积了。幸好,还有一条曲线救国的路可走,这就是多阶段构建法。

多阶段构建的思想其实很简单,先构建一个大而全的镜像,然后只把镜像中有用的部分拿出来,放在一个新的镜像里。在我们的场景下,pip只在构建镜像的过程中需要,而对运行我们的程序却一点用处也没有。我们只需要安装pip,再用pip安装第三方库,然后将第三方库从这个镜像中复制到一个只有python,没有pip的镜像中,这样,pip占用的268MB空间就可以被节省出来了。

1、在ubuntu镜像的基础上安装python:

然后运行:

这样,就生成了python:3.8-ubuntu镜像。

2、在python:3.8-ubuntu的基础上安装pip:

然后运行:

这样,就生成了python:3.8-ubuntu-pip镜像。

3、多阶段构建目标镜像:

这个dockerfile需要解释一下了,因为它有两个FROM命令。

第一个是以python:3.8-ubuntu-pip镜像为基础,安装numpy,当然,在实际应用中,把所有用到的第三方库出写在这里。

第二个FROM是以FROM python:3.8-ubuntu镜像为基础,将第三方库统统复制过来,COPY命令后的–from=0的意思是从第0阶段进行复制。实际应用中再从上下文中复制程序代码,添加需要的ENTRYPOINT等。

最后,再运行:

这然,用于我们项目的镜像就做好了。比使用官方python镜像构建的版本,小了大约750MB。

到此,我们的镜像已经制作好了,可是,镜像文件在哪,如何在生产环境下运行呢?

刚才使用docker images命令时,已经看到了生成的镜像:

我们可以使用docker save命令将镜像保存到指定的文件中,保存的文件是一个.tar格式的压缩文件:

将hello.tar复制到生产环境的机器上,然后执行导入命令:

就可以使用了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有